假设我们有一台物理机器 128G内存 16个core
生产如何调优Container参数?
Container:虚拟化的容器 维度 memory+vcore
作用是运行task任务
- 装完CentOS,消耗内存1G
- 系统预览15%-20%内存(包含系统1G内存),
以防全部使用导致系统夯住 和 oom机制事件,或者给未来部署组件预览点空间 - 此时需要预留内存为:128*20%=25.6G == 预留 26G
- 假设只有DN NM节点,余下内存 128-26=102g
- DN=2G、NM=4G;所以剩下102-2-4=96G
container内存
- 可以调优如下:
- yarn.nodemanager.resource.memory-mb 96G
- yarn.scheduler.minimum-allocation-mb 1G 极限情况下,只有96个container 内存1G
- yarn.scheduler.maximum-allocation-mb 96G 极限情况下,只有1个container 内存96G
- container的内存会自动增加,默认1g递增
每个container内存范围:1-96个
container虚拟核
vcore
yarn自己引入的,设计初衷是考虑不同节点的CPU的性能不一样,每个CPU的计算能力不一样。
比如某个物理CPU是另外一个物理CPU的2倍,这时通过设置第一个物理CPU的虚拟core来弥补这种差异。十年之前:
- 第一台机器 强悍 pcore: vcore=1:2
- 第二台机器 不强悍 pcore: vcore=1:1
- 在xml配置
官网默认 yarn.nodemanager.resource.pcores-vcores-multiplier 2
目前已无需调整这个参数,因为现在的物理机性能都差不多
所有节点 pcore: vcore=1:2物理核:虚拟核 =1:2 此时这台机器有32个vcore
可以调优如下:
- yarn.nodemanager.resource.cpu-vcores 32
- yarn.scheduler.minimum-allocation-vcores 1 极限情况下,只有32个container
- yarn.scheduler.maximum-allocation-vcores 32 极限情况下,只有1个container
- container个数范围为:1-32个
官方建议
- cloudera公司推荐,一个container的vcore最好不要超过5,那么我们设置4
- yarn.scheduler.maximum-allocation-vcores 4 极限情况下,只有8个container
综合memory+vcore
- 首先可以确定 vcore=4 container 8个
- 确定内存:
- yarn.nodemanager.resource.memory-mb 96G
- yarn.scheduler.minimum-allocation-mb 1G
- yarn.scheduler.maximum-allocation-mb 12G 极限container 8个
- 确定vcore
- yarn.nodemanager.resource.cpu-vcores 32
- yarn.scheduler.minimum-allocation-vcores 1
- yarn.scheduler.maximum-allocation-vcores 4 极限container 8个
- 8个container 12G 4vcore
当然当spark计算时内存不够大,这个参数肯定要调大,那么这种理想化的设置个数必然要打破,以memory为主,也就是说可以舍弃部分vcore(也就是调整vcore的个数来改变container的个数)。
默认规则
如果不合理规划,按照官网默认参数
- 内存
- yarn.nodemanager.resource.memory-mb 96G
- yarn.scheduler.minimum-allocation-mb 1G
- yarn.scheduler.maximum-allocation-mb 8G
- 12container 12*2=24 浪费了36-24=12个core
- vcore
- yarn.nodemanager.resource.cpu-vcores 32
- yarn.scheduler.minimum-allocation-vcores 1
- yarn.scheduler.maximum-allocation-vcores 2
- 16 container*8g 内存爆掉
假如该节点还有组件
假如 256G内存 56core,并且有hbase regionserver进程,那么该如何设置?
hbase regionserver = 30G
256*20%=52
256-2-4-30-52=168
56/4=14
- 首先可以确定 vcore=4 container 14个
- 确定内存:
- yarn.nodemanager.resource.memory-mb 168G
- yarn.scheduler.minimum-allocation-mb 1G
- yarn.scheduler.maximum-allocation-mb 12 G 极限container 14个
- 确定vcore
- yarn.nodemanager.resource.cpu-vcores 56
- yarn.scheduler.minimum-allocation-vcores 1
- yarn.scheduler.maximum-allocation-vcores 4 极限container 14个
- 14个container 12G 4vcore
Yarn调度器和调度算法
- 集群资源调度器需要解决:
- 多租户(Multi-tenancy):
- 多用户同时提交多种应用程序
- 资源调度器需要解决如何合理分配资源。
- 可扩展性(Scalability):增加集群机器的数量可以提高整体集群性能。
- 多租户(Multi-tenancy):
- Yarn使用队列解决多租户中共享资源的问题
- 支持三种资源调度器
- FIFO
- Capacity Scheduler
- Fair Scheduler
- FIFO 先进先出
- 意思就是队列需要等待,如图中job2必须在job1执行完毕之后才可以执行
- Capacity 计算
- 官网 https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
- 有一个专门的队列来运行小任务,但是为了小任务专门设置一个队列预先占用一定的集群资源。
- 这会导致大任务的执行时间落后FIFO的调度时间
- 如图中有一个常置队列B,小作业job2会直接进入queueB和job1同时进行计算
- 如果有大作业过来,就会和FIFO一样需要等待queueA中的job执行结束才可以进行
- Fair 公平
- 官网:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
- 如图中,job1在占用全部资源的情况下,job2会在job1的某个task运行完毕后借助这块小资源允许job2,运行完毕后归还给job1
apache 默认计算:
yarn.resourcemanager.scheduler.class
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
CDH 默认公平:
web配置 Fair
FIFO调度器
- 所有向集群提交的作业使用一个队列
- 根据提交作业的顺序来运行(先来先服务)
- 优点:
- 简单易懂
- 可以按照作业优先级调度
- 缺点:
- 资源利用率不高
- 不允许抢占
Capacity Scheduler资源调度器
- 设计思想:
- 资源按照比例分配给各个队列
- 特点
- 计算能力保证
- 以队列为单位划分资源,每个队列最低资源保证。
- 灵活性
- 当某个队列空闲时,其资源可以分配给其他的队列使用。
- 支持优先级
- 单个队列内部使用FIFO,支持作业优先级调度
- 多租户
- 综合考虑多种因素防止单个作业、用户或者队列独占资源。
- 每个队列可以配置一定比例的最低资源配置和使用上限。
- 每个队列有严格的访问控制,只能向自己的队列提交任务。
- 基于资源的调度
- 支持内存资源调度和CPU资源的调度。
- 支持抢占(从2.8.0版本开始)
- 计算能力保证
Capacity Scheduler配置
Capacity Scheduler资源分配算法
- 选择队列
• 从根队列开始,使用深度优先算法找出资源占用率最低的叶子队列 - 选择作业
• 默认按照作业优先级和提交时间顺序选择 - 选择Container
• 取该作业中最高优先级的Container,如果优先级相同会选择满足本地性的Container:Node Local >Rack Local > Different Rack
Fair Scheduler资源调度器
- 设计思想
- 资源公平分配
- 具有与Capacity Scheduler相似的特点
- 树状队列
- 每个队列有独立的最小资源保证
- 空闲时可以分配资源给其他队列使用
- 支持内存资源调度和CPU资源调度
- 支持抢占
- 不同点
- 核心调度策略不同
- Capacity Scheduler优先选择资源利用率低的队列
- 公平调度器考虑的是公平,公平体现在作业对资源的缺额
- 单独设置队列间资源分配方式
- FAIR(默认used memory/min share)
- DRF(主资源公平调度)
- 单独设置队列内部资源分配方式
- FAIR DRF FIFO
- 核心调度策略不同
FAIR资源分配算法
- 总体流程与Capacity Scheduler一致
- 1.选择队列
- 2.选择作业
- 3.选择Container
- 选择队列和作业使用公平排序算法
- 实际最小份额
minShare = Min(资源需求量,配置minShare) - 是否饥饿
isNeedy = 资源使用量< minShare - 资源分配比
minShareRatio = 资源使用量/Max(minShare, 1) - 资源使用权重比
useToWeightRatio = 资源使用量/权重
权重在配置文件中配置
- 实际最小份额
- 参考 FairShareComparator实现类